package cn.hysh.appium.datadriver;

import org.apache.poi.hssf.usermodel.HSSFWorkbook;
import org.apache.poi.ss.usermodel.Row;
import org.apache.poi.ss.usermodel.Sheet;
import org.apache.poi.ss.usermodel.Workbook;
import org.apache.poi.xssf.usermodel.XSSFCell;
import org.apache.poi.xssf.usermodel.XSSFRow;
import org.apache.poi.xssf.usermodel.XSSFSheet;
import org.apache.poi.xssf.usermodel.XSSFWorkbook;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.text.DecimalFormat;
import java.util.ArrayList;
import java.util.List;

//本类主要实现后缀为xlsx的 excel文件操作
public class ExcelUtil {

	private  XSSFSheet ExcelWSheet;
	private  XSSFWorkbook ExcelWBook;
	private  XSSFCell Cell;
	private  XSSFRow Row;
	private  String filePath;

	// 设定要操作的 Excel 的文件路径和 Excel 文件中的 sheet 名称
	// 在读写excel的时候，均需要先调用此方法，设定要操作的 excel 文件路径和要操作的 sheet 名称
	public ExcelUtil(String Path, String SheetName)
			throws Exception {
		FileInputStream ExcelFile;
		
		try {
			// 实例化 excel 文件的 FileInputStream 对象
			ExcelFile = new FileInputStream(Path);
			// 实例化 excel 文件的 XSSFWorkbook 对象
			ExcelWBook = new XSSFWorkbook(ExcelFile);
			// 实例化 XSSFSheet 对象，指定 excel 文件中的 sheet 名称，后续用于 sheet 中行、列和单元格的操作
			ExcelWSheet = ExcelWBook.getSheet(SheetName);

		} catch (Exception e) {
			throw (e);
		}
		filePath=Path;

	}

	// 读取 excel 文件指定单元格的函数，此函数只支持后缀为xlsx的 excel 文件
	public  String getCellData(int RowNum, int ColNum) throws Exception {

		try {
			// 通过函数参数指定单元格的行号和列号，获取指定的单元格对象
			Cell = ExcelWSheet.getRow(RowNum).getCell(ColNum);
			// 如果单元格的内容为字符串类型，则使用 getStringCellValue 方法获取单元格的内容
			// 如果单元格的内容为数字类型，则使用 getNumericCellValue() 方法获取单元格的内容
			String CellData="";
//			String CellData=""; = (String) (Cell.getCellType() == XSSFCell.CELL_TYPE_STRING ? Cell
//					.getStringCellValue() + ""
//					: Cell.getNumericCellValue());
			if(Cell.getCellType() == XSSFCell.CELL_TYPE_STRING){
				CellData=Cell.getStringCellValue();
			}else if(Cell.getCellType() ==XSSFCell.CELL_TYPE_NUMERIC){
				DecimalFormat df = new DecimalFormat("0");
				CellData = df.format(Cell.getNumericCellValue());
			}

			return CellData;

		} catch (Exception e) {
			e.printStackTrace();
			return  "";
		}

	}

	// 在 excel 文件的执行单元格中写入数据，此函数只支持后缀为xlsx的 excel 文件写入
	public  void setCellData(int RowNum, int ColNum, String result)
			throws Exception {

		try {
			// 获取 excel文件中的行对象
			Row = ExcelWSheet.getRow(RowNum);
			// 如果单元格为空，则返回 Null
			Cell = Row.getCell(ColNum, Row.RETURN_BLANK_AS_NULL);
//			CellStyle style=ExcelWBook.createCellStyle();
//			style.setFillForegroundColor(IndexedColors.RED.getIndex());
//			Cell.setCellStyle(style);
			

			if (Cell == null) {
				Cell = Row.createCell(ColNum);
				Cell.setCellValue(result);
				

			} else {
				Cell.setCellValue(result);
				System.out.println("执行完成");

			}
			FileOutputStream fileOut = new FileOutputStream(
					filePath);
			ExcelWBook.write(fileOut);
			fileOut.flush();
			fileOut.close();

		} catch (Exception e) {
			e.printStackTrace();
			throw (e);
			
		}
	}

	// 从 excel 文件获取测试数据的静态方法
	public static Object[][] getTestData(String excelFilePath,
			String sheetName) throws IOException {
		File file = new File(excelFilePath);
		FileInputStream inputStream = new FileInputStream(file);
		Workbook Workbook = null;
		String fileExtensionName = excelFilePath.substring(excelFilePath.indexOf("."));

		if (fileExtensionName.equals(".xlsx")) {
			Workbook = new XSSFWorkbook(inputStream);
		} else if (fileExtensionName.equals(".xls")) {
			Workbook = new HSSFWorkbook(inputStream);
		}
		Sheet Sheet = Workbook.getSheet(sheetName);

		int rowCount = Sheet.getLastRowNum() - Sheet.getFirstRowNum();
		System.out.println(rowCount);

		List<Object[]> records = new ArrayList<Object[]>();
		for (int i = 1; i<=rowCount; i++) {
			Row row = Sheet.getRow(i);

			String fields[] = new String[row.getLastCellNum() - 2];
			System.out.println(row.getCell(row.getLastCellNum()-2).getStringCellValue());
			if (row.getCell(row.getLastCellNum()-2).getStringCellValue().equalsIgnoreCase("y")) {

				for (int j = 0; j<row.getLastCellNum()-2; j++) {
					if(row.getCell(j).getCellType()==XSSFCell.CELL_TYPE_STRING){
						fields[j]=row.getCell(j).getStringCellValue();
					}else if(row.getCell(j).getCellType()==XSSFCell.CELL_TYPE_NUMERIC){
						DecimalFormat df = new DecimalFormat("0");
						fields[j] = df.format(row.getCell(j).getNumericCellValue());
					}else{
						System.out.println("格式错误");
					}
				}
				records.add(fields);
			}
			
		}

		// 定义函数返回值，即 Object[][]
		// 将存储测试数据的 list 转换为一个 Object 的二维数组
		//{{“”，“”，“”}，{“”，“”，“”}，{“”，“”，“”}，{“”，“”，“”}}
		Object[][] results = new Object[records.size()][];
		for (int i = 0; i<records.size(); i++) {
			results[i] = records.get(i);
		}
		return  results;
	}
	public  int getLastColumnNum(){
		return  ExcelWSheet.getRow(0).getLastCellNum()-1;
	}
	public static void main(String[] args) throws Exception {
		Object[][] ob=getTestData("C:\\Users\\Administrator\\Desktop/test.xlsx", "Sheet1");
		for(int i=0;i<ob.length;i++){
			Object[] obl=ob[i];
			System.out.println("========");
			for(int j=0;j<obl.length;j++){
				System.out.println(obl[j]);
			}
		}
	}
}

